package controllers.Administrador;

import java.util.Collection;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import services.ComunidadDeVecinosService;
import services.VecinoService;
import controllers.AbstractController;
import domain.ComunidadDeVecinos;
import domain.Vecino;
import forms.VecinoForm;

@Controller
@RequestMapping("/security/registration")
public class RegisterVecinoController extends AbstractController {

	@Autowired
	private VecinoService vecinoService;

	@Autowired
	private ComunidadDeVecinosService comunidadDeVecinosService;

	// Creation
	@RequestMapping(value = "/vecino", method = RequestMethod.GET)
	public ModelAndView registration(@RequestParam int comunidadId) {
		ModelAndView result;
		VecinoForm vecinoForm;
		Boolean isAdministrator;
		Collection<Vecino> vecinosOtrasComunidades;

		vecinosOtrasComunidades = vecinoService.findByNotCommunity(comunidadId);

		isAdministrator = false;
		vecinoForm = new VecinoForm();
		vecinoForm.setComunidadId(comunidadId);
		vecinoForm.setVecinoId(0);
		vecinoForm.setMoroso(false);

		result = new ModelAndView("security/registration/vecino");
		result.addObject("vecinoForm", vecinoForm);
		result.addObject("vecinosOtrasComunidades", vecinosOtrasComunidades);
		result.addObject("isAdministrator", isAdministrator);

		return result;
	}

	// Edition
	@RequestMapping(value = "/vecino", method = RequestMethod.POST, params = "save")
	public ModelAndView save(@Valid VecinoForm vecinoForm, BindingResult binding) {
		ModelAndView result;
		Vecino vecino;
		Boolean isAdministrator;

		if (binding.hasErrors()) {
			result = createEditModelAndView(vecinoForm);
		} else {
			try {
				if (!vecinoForm.getAcceptConditions()) {
					result = createEditModelAndView(vecinoForm,
							"security.commit.noAcceptConditions");
				}
				Collection<String> viviendasOcupadas;
				viviendasOcupadas = comunidadDeVecinosService
						.findViviendasOcupadas(vecinoForm.getComunidadId());
				if (viviendasOcupadas.contains(vecinoForm.getVivienda())) {
					result = createEditModelAndView(vecinoForm,
							"comunidad.vivienda.error");

				} else {
					vecino = vecinoService.reconstruct(vecinoForm);
					vecinoService.save(vecino, vecinoForm.getComunidadId());
					result = new ModelAndView(
							"redirect:/comunidad/administrator/edit.do?comunidadId="
									+ vecinoForm.getComunidadId());
				}
			} catch (Throwable oops) {

				result = createEditModelAndView(vecinoForm,
						"vecino.commit.error");
			}
		}
		isAdministrator = false;
		result.addObject("isAdministrator", isAdministrator);
		return result;
	}

	@RequestMapping(value = "/vecinoExistente", method = RequestMethod.GET)
	public ModelAndView save(@RequestParam int vecinoId, int comunidadId) {
		ModelAndView result;
		Vecino vecino;
		Boolean isAdministrator;
		VecinoForm vecinoForm;
		vecinoForm = new VecinoForm();
		vecinoForm.setComunidadId(comunidadId);
		vecinoForm.setVecinoId(0);
		vecinoForm.setMoroso(false);

		try {
			vecino = vecinoService.findOne(vecinoId);
			Collection<String> viviendasOcupadas;
			viviendasOcupadas = comunidadDeVecinosService
					.findViviendasOcupadas(comunidadId);
			if (viviendasOcupadas.contains(vecino.getVivienda())) {

				result = createEditModelAndView(vecinoForm,
						"comunidad.vivienda.error");

			} else {
				Collection<ComunidadDeVecinos> comunidades;
				ComunidadDeVecinos comunidadNueva;

				comunidadNueva = comunidadDeVecinosService.findOne(comunidadId);
				comunidades = vecino.getComunidadesDeVecinos();

				comunidades.add(comunidadNueva);
				vecino.setComunidadesDeVecinos(comunidades);

				vecinoService.save(vecino);
				result = new ModelAndView(
						"redirect:/comunidad/administrator/edit.do?comunidadId="
								+ comunidadId);
			}
		} catch (Throwable oops) {

			result = createEditModelAndView(vecinoForm, "vecino.commit.error");
		}

		isAdministrator = false;
		result.addObject("isAdministrator", isAdministrator);
		return result;
	}

	// Ancillary methods
	protected ModelAndView createEditModelAndView(VecinoForm vecinoForm) {
		ModelAndView result;

		result = createEditModelAndView(vecinoForm, null);

		return result;
	}

	protected ModelAndView createEditModelAndView(VecinoForm vecinoForm,
			String message) {
		ModelAndView result;

		Collection<Vecino> vecinosOtrasComunidades;
		result = new ModelAndView("security/registration/vecino");

		vecinosOtrasComunidades = vecinoService.findByNotCommunity(vecinoForm
				.getComunidadId());

		result.addObject("vecinoForm", vecinoForm);
		result.addObject("vecinosOtrasComunidades", vecinosOtrasComunidades);
		result.addObject("message", message);

		return result;
	}
}